import axios from 'axios';

// 存储待处理的请求
const pendingMap = new Map();

/**
 * 生成请求唯一key
 * @param {Object} config - 请求配置
 * @returns {Array} 唯一标识数组
 */
export function getPendingKey(config) {
  const { url, method, params, data } = config;
  // response里面返回的config.data是个字符串对象
  const parsedData = typeof data === 'string' ? JSON.parse(data) : data;
  return [url, method, JSON.stringify(params), JSON.stringify(parsedData)];
}

/**
 * 存储每个请求的唯一cancel值，作为唯一标识
 * @param {Object} config - 请求配置
 */
export function addPending(config) {
  const pendingKey = getPendingKey(config);
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken((cancel) => {
      if (!pendingMap.has(pendingKey)) {
        pendingMap.set(pendingKey, cancel);
      }
    });
}

/**
 * 删除重复请求
 * @param {Object} config - 请求配置
 */
export function removePending(config) {
  //获取当前config的唯一key
  const pendingKey = getPendingKey(config);
  //判断是否有key已经存在集合
  if (pendingMap.has(pendingKey)) {
    //删除
    const cancelToken = pendingMap.get(pendingKey);
    cancelToken(pendingKey);
    pendingMap.delete(pendingKey);
  }
}

/**
 * 检查请求是否为FormData
 * @param {any} data - 请求数据
 * @returns {boolean} 是否为FormData
 */
export function isFormDataRequest(data) {
  return data instanceof FormData;
}
